package utils

import (
	"path/filepath"
	"regexp"
	"strings"
)

// 定义允许的文件扩展名
var allowedExtensions = map[string]bool{
	".pdf":  true,
	".docx": true,
	".txt":  true,
	".png":  true,
	".jpg":  true,
	".jpeg": true,
}

// IsValidTmpPath 检查是否是有效的临时文件路径
func IsValidTmpPath(path string) bool {
	// 1. 检查是否以 "tmp/" 开头
	if !strings.HasPrefix(path, "tmp/") {
		return false
	}

	// 2. 检查路径是否包含非法字符（如 :, *, ?, <, >, |, \, "）
	illegalChars := regexp.MustCompile(`[\\:*?"<>|"]`)
	if illegalChars.MatchString(path) {
		return false
	}

	// 3. 解析绝对路径，防止路径遍历（如 ../）
	absPath, err := filepath.Abs(path)
	if err != nil {
		return false
	}

	// 4. 检查解析后的路径是否仍然以 "tmp/" 开头（防止路径遍历）
	absTmpPrefix := filepath.Join(filepath.Dir(filepath.Dir(absPath)), "tmp")
	if !strings.HasPrefix(absPath, absTmpPrefix) {
		return false
	}

	// 5. 检查文件扩展名是否合法
	ext := strings.ToLower(filepath.Ext(path))
	if !allowedExtensions[ext] {
		return false
	}

	// 6. 进一步限制路径中的字符（支持中文字符集）
	// 允许字母、数字、下划线、连字符、点、斜杠，以及中文字符
	validChars := regexp.MustCompile(`^[\p{L}\p{N}_\-\.\/\p{Han}]+$`)
	trimmedPath := strings.TrimPrefix(path, "tmp/")
	return validChars.MatchString(trimmedPath)
}
